// 引入ali-oss
import store from '@/store'
import NProgress from 'nprogress'
import { Message } from 'element-ui' // progress bar

const OSS = require('ali-oss')
let client

export const initOss = function (params) {
  client = new OSS({
    region: 'oss-cn-hangzhou',
    accessKeyId: params.accessKeyId,
    accessKeySecret: params.accessKeySecret,
    stsToken: params.securityToken,
    bucket: params.bucket,
    endpoint: 'oss-cn-hangzhou.aliyuncs.com',
  })
  console.log('-------初始化oss-------', params)
}

/**
 *  上传文件，大小不能超过5GB
 * @param {string} ObjName OSS的储存路径和文件名字
 * @param {string} fileUrl 本地文件
 * @param {string} callBackParams 构造回调所需的参数
 * @param {string} callBackParams.objectType 	上传的文件类型
 * @param {string} callBackParams.code 	不同模块编号
 *
 * @retruns Promise
 */
export const put = async (objectName, fileUrl, callBackParams) => {
  if (!client) {
    const stsToken = store.getters.userInfo.stsToken
    if (stsToken) {
      // 重新实例化ali - oss client
      console.log('重新实例化ali - oss client')
      initOss(stsToken)
    }
  }
  // , genCallback({ objectName, ...callBackParams })
  try {
    NProgress.start()
    const result = await client.put(`${callBackParams.prefixPath}/${objectName}`, fileUrl)
    // AAA为文件夹， ObjName为文件名字,可以只写名字，就直接储存在 bucket 的根路径
    // console.log(result)
    NProgress.done()
    return result
  } catch (e) {
    // 其它oss上传错误信息请参考：https://help.aliyun.com/knowledge_detail/32005.html?spm=a2c4g.11186623.6.829.1a212f9bwEvSR7
    // console.log(e, '---')
    if (e.code === 'ConnectionTimeoutError') {
      Message({
        message: `网络延迟,请切换网络后重试！`,
        type: 'error'
      })
    } else if (e.code === 'RequestError') {
      Message({
        message: `网络中断，请重试！`,
        type: 'error'
      })
    } else {
      Message({
        message: `上传失效，请刷新页面重试！`,
        type: 'error'
      })
      store.dispatch('refreshToken')
    }
    NProgress.done()
  }
}

/**
 * 生成随机文件名称
 * 规则八位随机字符，加下划线连接时间戳
 */
export const getFileNameUUID = () => {
  function rx () {
    return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1)
  }
  return `${+new Date()}_${rx()}${rx()}`
}

/**
 * 生成随机文件名称
 * 规则八位随机字符，加下划线连接时间戳
 */
export const customUploadImg = (resultFiles, insertImgFn, prefixPath = 'ADVERTISING') => {
  resultFiles.forEach(file => {
    put(getFileNameUUID(), file, { prefixPath })
      .then(res => {
        insertImgFn(res.url)
      })
  })
}

export { client }